Skip to main content

pacenotes_installer\wizard\scene/
language.rs

1use windows_sys::Win32::Foundation::{HWND, LPARAM, WPARAM};
2use windows_sys::Win32::UI::Controls as ctl;
3use windows_sys::Win32::UI::WindowsAndMessaging as wm;
4
5/// Scene 1: pick the language every later page is built in.
6pub unsafe extern "system" fn language_page(
7    dialog: HWND,
8    message: u32,
9    _wparam: WPARAM,
10    lparam: LPARAM,
11) -> isize {
12    match message {
13        wm::WM_INITDIALOG => {
14            initialize(dialog, lparam);
15            1
16        }
17        wm::WM_NOTIFY => match crate::wizard::page::notify_code(lparam) {
18            Some(ctl::PSN_SETACTIVE) => {
19                crate::wizard::page::set_sheet_caption(dialog);
20                crate::wizard::page::set_header(dialog, crate::i18n::IDS_S1_TITLE);
21                crate::wizard::page::set_buttons(dialog, ctl::PSWIZB_NEXT);
22                crate::wizard::page::set_next_text(dialog, crate::i18n::IDS_BTN_CONTINUE);
23                crate::wizard::page::reply(dialog, 0)
24            }
25            Some(ctl::PSN_WIZNEXT) => {
26                apply_pick(dialog);
27                crate::wizard::page::reply(dialog, 0)
28            }
29            Some(ctl::PSN_QUERYCANCEL) => crate::wizard::page::query_cancel(dialog),
30            _ => 0,
31        },
32        _ => 0,
33    }
34}
35
36unsafe fn initialize(dialog: HWND, lparam: LPARAM) {
37    let state = crate::wizard::page::adopt_state(dialog, lparam);
38    let combo = crate::wizard::control_ids::IDC_S1_COMBO;
39    crate::ui::set_text(
40        dialog,
41        crate::wizard::control_ids::IDC_S1_PROMPT,
42        crate::i18n::IDS_S1_PROMPT,
43    );
44    crate::ui::set_text(
45        dialog,
46        crate::wizard::control_ids::IDC_S1_NOTE,
47        crate::i18n::IDS_S1_RESTART,
48    );
49    for language in crate::i18n::Language::ALL {
50        crate::ui::combo_add(dialog, combo, language.label());
51    }
52    // The OS language on a fresh run, the kept one after a restart.
53    let initial = state.map_or(crate::i18n::Language::En, |state| state.language);
54    crate::ui::combo_select(dialog, combo, initial.index());
55}
56
57/// Later pages are created after this, so they come up in the picked language.
58unsafe fn apply_pick(dialog: HWND) {
59    let Some(state) = crate::wizard::page::state(dialog) else {
60        return;
61    };
62    let picked = crate::ui::combo_selection(dialog, crate::wizard::control_ids::IDC_S1_COMBO)
63        .map(crate::i18n::Language::from_index)
64        .unwrap_or(crate::i18n::Language::En);
65    state.language = picked;
66    crate::i18n::set_language(picked);
67}